return new self( $key, $params );
}
+ /**
+ * Transform a MessageSpecifier or a primitive value used interchangeably with
+ * specifiers (a message key string, or a key + params array) into a proper Message
+ * @param string|array|MessageSpecifier $value
+ * @return Message
+ * @throws InvalidArgumentException
+ */
+ public static function newFromSpecifier( $value ) {
+ if ( $value instanceof RawMessage ) {
+ $message = new RawMessage( $value->getKey(), $value->getParams() );
+ } elseif ( $value instanceof MessageSpecifier ) {
+ $message = new Message( $value );
+ } elseif ( is_array( $value ) ) {
+ $key = array_shift( $value );
+ $message = new Message( $key, $value );
+ } elseif ( is_string( $value ) ) {
+ $message = new Message( $value );
+ } else {
+ throw new InvalidArgumentException( __METHOD__ . ': invalid argument type '
+ . gettype( $value ) );
+ }
+
+ return $message;
+ }
+
/**
* Factory function accepting multiple message keys and returning a message instance
* for the first message which is non-empty. If all messages are empty then an
];
if ( isset( $button['label-message'] ) ) {
- $label = $this->msg( $button['label-message'] )->parse();
+ $label = $this->getMessage( $button['label-message'] )->parse();
} elseif ( isset( $button['label'] ) ) {
$label = htmlspecialchars( $button['label'] );
} elseif ( isset( $button['label-raw'] ) ) {
$errorstr = '';
foreach ( $errors as $error ) {
- if ( is_array( $error ) ) {
- $msg = array_shift( $error );
- } else {
- $msg = $error;
- $error = [];
- }
-
$errorstr .= Html::rawElement(
'li',
[],
- $this->msg( $msg, $error )->parse()
+ $this->getMessage( $error )->parse()
);
}
return $this;
}
+
+ /**
+ * Turns a *-message parameter (which could be a MessageSpecifier, or a message name, or a
+ * name + parameters array) into a Message.
+ * @param mixed $value
+ * @return Message
+ */
+ protected function getMessage( $value ) {
+ return Message::newFromSpecifier( $value )->setContext( $this );
+ }
}
* @return Message
*/
protected function getMessage( $value ) {
- if ( $value instanceof Message ) {
- return $value;
- } elseif ( $value instanceof MessageSpecifier ) {
- return Message::newFromKey( $value );
- } elseif ( is_array( $value ) ) {
- $msg = array_shift( $value );
- return $this->msg( $msg, $value );
- } else {
- return $this->msg( $value, [] );
- }
+ return Message::newFromSpecifier( $value )->setContext( $this->mParent );
}
}
if ( $isBadIE ) {
$label = $button['value'];
} elseif ( isset( $button['label-message'] ) ) {
- $label = new OOUI\HtmlSnippet( $this->msg( $button['label-message'] )->parse() );
+ $label = new OOUI\HtmlSnippet( $this->getMessage( $button['label-message'] )->parse() );
} elseif ( isset( $button['label'] ) ) {
$label = $button['label'];
} elseif ( isset( $button['label-raw'] ) ) {
}
foreach ( $errors as &$error ) {
- if ( is_array( $error ) ) {
- $msg = array_shift( $error );
- } else {
- $msg = $error;
- $error = [];
- }
- // if the error is already a message object, don't use it as a message key
- if ( !$msg instanceof Message ) {
- $error = $this->msg( $msg, $error )->parse();
- } else {
- $error = $msg->parse();
- }
+ $error = $this->getMessage( $error )->parse();
$error = new OOUI\HtmlSnippet( $error );
}
$msg = unserialize( serialize( $msg ) );
$this->assertEquals( 'Hauptseite', $msg->plain() );
}
+
+ /**
+ * @covers Message::newFromSpecifier
+ * @dataProvider provideNewFromSpecifier
+ */
+ public function testNewFromSpecifier( $value, $expectedText ) {
+ $message = Message::newFromSpecifier( $value );
+ $this->assertInstanceOf( Message::class, $message );
+ $this->assertSame( $expectedText, $message->text() );
+ }
+
+ public function provideNewFromSpecifier() {
+ $messageSpecifier = $this->getMockForAbstractClass( MessageSpecifier::class );
+ $messageSpecifier->expects( $this->any() )->method( 'getKey' )->willReturn( 'mainpage' );
+ $messageSpecifier->expects( $this->any() )->method( 'getParams' )->willReturn( [] );
+
+ return [
+ 'string' => [ 'mainpage', 'Main Page' ],
+ 'array' => [ [ 'youhavenewmessages', 'foo', 'bar' ], 'You have foo (bar).' ],
+ 'Message' => [ new Message( 'youhavenewmessages', [ 'foo', 'bar' ] ), 'You have foo (bar).' ],
+ 'RawMessage' => [ new RawMessage( 'foo ($1)', [ 'bar' ] ), 'foo (bar)' ],
+ 'MessageSpecifier' => [ $messageSpecifier, 'Main Page' ],
+ ];
+ }
}
+